/*
    封装实现一个SqliteHelper类，提供简单的sqlite数据库操作接口，完成数据的基础增删改查操作。
        1. 创建/打开数据库文件
        2. 针对打开的数据库执行操作
            1. 表的操作
            2. 数据的操作
        3. 关闭数据库
*/

#include <sqlite3.h>
#include <string>
#include <iostream>
#include <vector>

typedef int (*SqliteCallback)(void *, int, char **, char **);

class SqliteHelper
{
public:
    SqliteHelper(std::string dbfile)
        : _dbfile(dbfile), _handler(nullptr)
    {
    }

    bool open(int save_level = SQLITE_OPEN_FULLMUTEX)
    {
        int ret = sqlite3_open_v2(_dbfile.c_str(), &_handler, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | save_level, nullptr);
        if (ret != SQLITE_OK)
        {
            std::cout << "创建/打开数据库失败!!!" << std::endl;
            std::cout << sqlite3_errmsg(_handler) << std::endl;
            return false;
        }
        return true;
    }

    bool exec(const std::string &sql, SqliteCallback cb, void* args)
    {
        int ret = sqlite3_exec(_handler, sql.c_str(), cb, args, nullptr);
        if (ret != SQLITE_OK)
        {
            std::cout << sql << std::endl;
            std::cout << "sql语句执行失败!!!" << std::endl;
            std::cout << sqlite3_errmsg(_handler) << std::endl;
            return false;
        }
        return true;
    }

    bool close()
    {
        if (_handler)
        {
            sqlite3_close(_handler);
            return true;
        }
        return false;
    }

private:
    std::string _dbfile;
    sqlite3 *_handler;
};
